// type 和 interface 类似；区别：type 可以直接定义类型别名 type a = string; 但interfance不行
// interfance 中可以定义属性和方法
// 接口中只能定义一些应该有的属性和方法名，具体的实现和赋值要在类中去实现
// 接口可以进行多重继承和多重实现
// Typescript 中的 interface 和 type 到底有什么区别详解（https://www.jb51.net/article/163299.htm）
interface Person2 {
  name: string
  age?: number
  // 只读属性
  readonly country: string
  //任意数量的其它属性
  [propName: string]: any
  //方法
  say(): string
}

// 接口继承,继承Person2的所有属性和方法
interface Teacher2 extends Person2 {
  teach(): void
}

//类实现接口时，要将接口中声明的属性和方法都要进行赋值实现
class TeacherXue implements Teacher2 {
  name = 'xueyushuai'
  age = 12
  country = 'china'
  say() {
    return 'chinese'
  }
  teach() {
    console.log('js')
  }
}

// 函数类型
//接口表示一个函数类型,sayHi类型的函数，word表示函数参数，:string 表示返回值为string
interface SayHi {
  (word: string, langer: string): string
}

const say: SayHi = (word, langer) => {
  return '欢迎来到中国'
}

function getName(person: Person2): string {
  console.log(person.name)
  return person.name
}

function setName(person: Teacher2, name: string) {
  person.name = name
}
let personD = {
  name: 'dell',
  country: 'china',
  say() {
    return 'I am dell'
  },
  sex: 'man',
}

getName(personD)
setName(
  {
    name: 'dell',
    country: 'china',
    say() {
      return 'I am dell'
    },
    sex: 'man',
    teach() {
      console.log('teacher')
    },
  },
  'dell1'
)
